package com.algaworks.cursojsf2.financeiro.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import com.algaworks.cursojsf2.financeiro.model.Lancamento;
import com.algaworks.cursojsf2.financeiro.model.Pessoa;
import com.algaworks.cursojsf2.financeiro.model.TipoLancamento;
import com.algaworks.cursojsf2.financeiro.repository.Pessoas;
import com.algaworks.cursojsf2.financeiro.service.GestaoLancamentos;
import com.algaworks.cursojsf2.financeiro.service.RegraNegocioException;
import com.algaworks.cursojsf2.financeiro.util.FacesUtil;
import com.algaworks.cursojsf2.financeiro.util.Repositorios;

@ManagedBean
@ViewScoped
public class CadastroLancamentoBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Repositorios repositorios = new Repositorios();
	private Lancamento lancamento = new Lancamento();
	private List<Pessoa> pessoas = new ArrayList<Pessoa>();

	@PostConstruct
	public void init() {
		
		Pessoas pessoasHibernate = this.repositorios.getPessoas();		
		this.pessoas = pessoasHibernate.todas();

	}
	
	public boolean isEditando(){
		return this.lancamento.getCodigo() != null;
	}

	public List<Pessoa> getPessoas() {
		return pessoas;
	}

	public TipoLancamento[] getTiposLancamentos() {
		return TipoLancamento.values();
	}
	
	public void setLancamento(Lancamento lancamento) throws CloneNotSupportedException{
		this.lancamento = lancamento;
		if(this.lancamento==null)
			this.lancamento = new Lancamento();
		else{
			this.lancamento = (Lancamento) this.lancamento.clone();
		}
			
	}

	public Lancamento getLancamento() {
		return lancamento;
	}

	public void lancamentoPagoModificado(ValueChangeEvent e) {
		this.lancamento.setPago((Boolean) e.getNewValue());
		this.lancamento.setDataPagamento(null);
		FacesContext.getCurrentInstance().renderResponse();
	}

	public void salvar() {
		
		GestaoLancamentos gestaoLancamentos = new GestaoLancamentos(this.repositorios.getLancamentos());
		try {
			gestaoLancamentos.salvar(lancamento);
			this.lancamento = new Lancamento();
			FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO, "Salvo com sucesso!");
		} catch (RegraNegocioException e) {
			FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO, e.getMessage());
		}			
		

		
	}

}
